在 Next.js 中,
getStaticProps、getStaticPaths 和 getServerSideProps
是用來處理頁面數據獲取的三個不同方法。
方法 | 執行時間 | 適用場景 | 優點 | 缺點 |
---|---|---|---|---|
Static Site Generation (SSG) | 構建時(Build Time) | 適合內容固定或更新不頻繁的頁面,如博客、產品展示頁 | 非常快的頁面加載速度,優秀的 SEO 支持 | 構建後無法即時更新,更新後需要重新部署 |
Server-Side Rendering (SSR) | 每次請求時(Request Time) | 需要即時數據或個性化內容的頁面,如電子商務、社交媒體 | 每次請求都能獲取最新數據,適合需要動態內容的頁面 | 速度較慢,會導致初次頁面加載較慢,對伺服器負載較高 |
Incremental Static Regeneration (ISR) | 構建後且定時更新(Build Time + Revalidation) | 靜態頁面但需要定期更新的應用,如新聞網站、電子商務產品頁 | 靜態頁面但可以定時更新內容,具備 SSG 的速度又能保持更新 | 需要指定重新驗證間隔,過於頻繁的更新可能會增加複雜性 |
它們分別針對不同的場景進行數據加載。讓我們逐一解釋它們的作用和區別:
方法 | 執行時間 | 什麼時候使用? | 優點 | 缺點 |
---|---|---|---|---|
getStaticProps | 構建時 | 當頁面內容不常更新且可在構建時確定 | 較快的頁面加載速度,適合 SEO | 構建後無法立即反映數據變更 |
getStaticPaths | 構建時 | 搭配動態路由的靜態頁面生成 | 靜態生成動態路徑頁面,結合 getStaticProps 使用 | 需要在構建時就知道所有的動態路徑 |
getServerSideProps | 每次請求時 | 當需要實時數據或者頁面需要個性化渲染 | 每次請求都能獲取最新數據,適合需要動態內容的頁面 | 較慢的頁面加載速度,對服務器負擔較大 |
import React from 'react';
const Posts = ({ posts }) => (
<div>
<h1>Posts</h1>
<ul>
{posts.map(post => (
<li key={post.id}>{post.title}</li>
))}
</ul>
</div>
);
export async function getStaticProps() {
const res = await fetch('https://api.example.com/posts');
const posts = await res.json();
return {
props: { posts }, // 傳遞到頁面的 props
};
}
import React from 'react';
const Post = ({ post }) => (
<div>
<h1>{post.title}</h1>
<p>{post.content}</p>
</div>
);
export async function getStaticPaths() {
const res = await fetch('https://api.example.com/posts');
const posts = await res.json();
const paths = posts.map((post) => ({
params: { id: post.id.toString() },
}));
return { paths, fallback: false };
}
export async function getStaticProps({ params }) {
const res = await fetch(`https://api.example.com/posts/${params.id}`);
const post = await res.json();
return { props: { post } };
}
在這裡,我們為每個 post.id 生成一個對應的靜態頁面。
// pages/dashboard.js
import React from 'react';
const Dashboard = ({ data }) => (
<div>
<h1>Dashboard</h1>
<p>{data.info}</p>
</div>
);
export async function getServerSideProps() {
const res = await fetch('https://api.example.com/data');
const data = await res.json();
return {
props: { data }, // 傳遞到頁面的 props
};
}
概念:在構建時生成靜態頁面,適合內容更新不頻繁的網站。
執行方法:使用 getStaticProps 和 getStaticPaths。
getStaticProps 用於在構建時獲取數據並生成靜態頁面。
getStaticPaths 用於定義動態路徑,以便靜態生成這些路徑的頁面。
概念:每次用戶請求頁面時,伺服器生成頁面,適合需要實時數據的應用。
執行方法:使用 getServerSideProps。
getServerSideProps 用於在每次請求時獲取數據並生成頁面,確保用戶獲取的是最新的數據。
概念:在構建時生成靜態頁面,並允許根據時間定期更新靜態內容。
執行方法:使用 getStaticProps,但加上 revalidate 屬性。
getStaticProps 用於初始生成靜態頁面,而 revalidate 參數指定了多久後頁面會被重新生成,以獲取最新數據。
SSG、SSR 和 ISR 是三種不同的渲染方法,根據應用需求的不同選擇使用。
getStaticProps、getStaticPaths 和 getServerSideProps 是 Next.js 提供的函數,用於具體實現這些概念的渲染方法。它們決定了如何獲取數據以及何時生成頁面。